package basics.passByValue;

import org.junit.Test;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * @author jiangwz
 * @create 2019/11/4.
 */
public class Test01 {

    @Test
    public void test01(){
        int num1 = 10;
        int num2 = 20;
        // 因为是基本数据类型,所以传递的都是副本,修改副本是不会影响原值的
        swap(num1, num2);
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }

    //一个方法不能修改一个基本数据类型的参数  修改的全是拷贝的副本
    private void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }

    @Test
    public void test02(){
        int[] arr = { 1, 2, 3, 4, 5 };
        System.out.println(arr[0]);
        // change方法传的是引用副本,但是引用副本所连接的还是真实对象,真实对象被修改,原值也会被修改
        change(arr);
        System.out.println(arr[0]);
    }

    // 如果参数是对象应用就会把值改变
    // array是一个引用副本,但是连接的还是真实对象的地址,所以修改的还是真实对象
    public void change(int[] array) {
        // 将数组的第一个元素变为0
        array[0] = 0;
    }


    @Test
    public void test03(){
        // TODO Auto-generated method stub
        Student s1 = new Student("小张");
        Student s2 = new Student("小李");
        swap2(s1, s2);
        System.out.println("s1:" + s1.getName());
        System.out.println("s2:" + s2.getName());
    }
    // 这里为什么没变呢? 因为x,y全是拷贝的副本,交换的引用都是副本的引用,与真实对象无关
    public void swap2(Student x, Student y) {
        Student temp = x;
        x = y;
        y = temp;
        System.out.println("x:" + x.getName());
        System.out.println("y:" + y.getName());

        // 如果加上这句,  y的引用指向s1 把y改了就是把s1的值改了
//        y.setName("666");
    }

    @Data
    @AllArgsConstructor
    class Student{
        private String name;
    }
}
